package cxydmmszl.chapter09.t154;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.HashMap;

/**
 * <li style="color: red;">Prob</li>
 * 设计有 setAll 功能的哈希表
 * <li style="color: green;">Desc</li>
 * 哈希表常见的三个操作时 put、get 和 containsKey，而且这三个操作的时间复杂度为 O(1)。
 * 现在想加一个 setAll 功能，就是把所有记录 value 都设成统一的值。
 * 请设计并实现这种有 setAll 功能的哈希表，并且 put、get、containsKey 和 setAll 四个操作的时间复杂度都为O(1)。
 * <br/>[友情提示]: C++ 选手若有需要可以使用 unordered_map 替换 map 来将复杂度从 O(log n) 降为O(1)
 * <li style="color: green;">Input</li>
 * 第一行一个整数 N 表示操作数。<br/>
 * 接下来 N 行，每行第一个数字 opt 代表操作类型<br/>
 * 若 opt=1，接下来有两个整数 x, y 表示设置 key=x 对应的 value=y<br/>
 * 若 opt=2，接下来一个整数 x，表示查询 key=x 对应的 value，若 key=x 不存在输出 -1<br/>
 * 若 opt=3，接下来一个整数 x，表示把加入过的所有的 key 对应的 value 都设置为 x
 * <li style="color: green;">Output</li>
 * 对于每个操作 2，输出一个整数表示答案
 * <li style="color: blue;">Link</li> CD62
 *
 * @author habitplus
 * @since 2021-10-31 13:34
 */
public class Main {
    static final StreamTokenizer st =
            new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

    static int nextInt() {
        try {
            st.nextToken();
        } catch (IOException e) {
            throw new RuntimeException("Input is invalid!");
        }
        return (int) st.nval;
    }

    public static void main(String[] args) throws IOException {
//        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        int n = Integer.parseInt(br.readLine());
//        String[] ss;
        int n = nextInt();
        int opt, x, y;
        MyMap map = new MyMap();
        while (n-- > 0) {
            opt = nextInt();
            if (opt == 1) {
                x = nextInt();
                y = nextInt();
                map.put(x, y);
            } else if (opt == 2) {
                x = nextInt();
                y = map.get(x);
                System.out.println(y);
            } else if (opt == 3) {
                x = nextInt();
                map.setAll(x);
            }
        }
    }
}

class Value {
    // 时间戳
    int timestamp;
    // 对应的值
    int val;

    public Value(int timestamp, int val) {
        this.timestamp = timestamp;
        this.val = val;
    }
}

class MyMap {
    HashMap<Integer, Value> data = new HashMap<>();
    private int time;
    private final Value all;

    public MyMap() {
        this.data = new HashMap<>();
        this.time = 0;
        this.all = new Value(-1, -1);
    }

    public void put(int k, int v) {
        this.data.put(k, new Value(time++, v));
    }


    public int get(int k) {
        if (!this.data.containsKey(k)) return -1;

        Value value = this.data.get(k);
        return value.timestamp > all.timestamp ? value.val : all.val;
    }

    public void setAll(int v) {
        this.all.timestamp = time++;
        this.all.val = v;
    }
}
